﻿using System;
using System.Collections.Generic;
using CRC.Clases;
using NHibernate;
using CRC.NHibernate;
using CRC.Inspecciones.Dominio.Clases;
using CRC.GestionSalones.Dominio.Clases;

namespace CRC.Inspecciones.Dominio.Controlador
{

    class Controlador_ModificarZona
    {

        private Zona zona = null;

        public IList<Salon> VisualizarSalonesPotenciales()
        {
            ISession session = null;
            ITransaction tx = null;
            IList<Salon> potenciales = null;

            try
            {

                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                potenciales = session.CreateQuery("from Salon s where s.Zona is null").List<Salon>();
                tx.Commit();

                return potenciales;

            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }
        }

        public IList<Persona> VisualizarInspectores()
        {
            ISession session = null;
            ITransaction tx = null;
            IList<Persona> infoInspectores = null;
            string hqlQuery = "from Persona p where p.Tipo.Descripcion='inspector'";

            try
            {

                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                infoInspectores = session.CreateQuery(hqlQuery).List<Persona>();

                tx.Commit();
                return infoInspectores;

            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                throw he;
            }
            finally
            {
                if (session != null) session.Close();
            }
        }

        public Zona ObtenerZona(int pintZona) {
            ISession session = null;
            ITransaction tx = null;
            
            try 
            {
                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                this.zona = (Zona)session.Load(typeof(Zona), pintZona);
                tx.Commit();
                return zona;

            } catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }
        }

        public Zona ModificarZona(string pstrNuevoNombre, int pintInspector, IList<Salon> salonesAsignados)
        {
            ISession session = null;
            ITransaction tx = null;
            string query = String.Empty;

            try
            {

                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                //Precondicion 1: No existe la zona con el nombre indicado
                if (pstrNuevoNombre.CompareTo(this.zona.Nombre) != 0)
                {
                    query = "from Zona z where z.Nombre='" + pstrNuevoNombre + "'";
                    IList<Zona> res = session.CreateQuery(query).List<Zona>();

                    if (res.Count > 0)
                    {
                        throw new Exception("¡Ya existe una zona con nombre " + pstrNuevoNombre + "!");
                    }
                }
                //precondicion 2: El inspector no esta ya asignada a una zona
                if (pintInspector != this.zona.Inspector.Id)
                {
                    query = "from Zona z where z.Inspector.Id=" + pintInspector;
                    IList<Zona> res2 = session.CreateQuery(query).List<Zona>();

                    if (res2.Count > 0)
                    {
                        throw new Exception("¡El inspector indicado ya tiene asignada una zona para inspección!");
                    }
                }
                

                this.zona.Nombre = pstrNuevoNombre;
                Persona inspector = (Persona)session.Load(typeof(Persona), pintInspector);

                //inspector.ZonaAsignada = zona;
                this.zona.Inspector = inspector;
                //Quitamos los salones (para quitar los que se hayan desasignado)
                foreach (Salon s in zona.Salones) {
                    s.Zona = null;
                }
                zona.Salones.Clear();

                //Añadimos los asignados
                foreach (Salon s in salonesAsignados)
                {
                    zona.añadirSalon(s);
                }

                session.Update(zona);
                tx.Commit();

                return zona;

            } catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }
        }
        
    }
}
